package paquete;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;


public class Generales {
	
	/*
	 * Esta clase alberga listas sobre todos los datos consultables
	 * */

	private static int diasPrestamo = 30;	//Estado VERDE de los libros
	private static int diasTolerancia = 15;	//Estado AMARILLO de los libros
	private static int diasAlerta = 5;		//Estado ROJO de los libros
	private static Calendar fechaDelSistema = new GregorianCalendar();
    SimpleDateFormat formatoFecha = new SimpleDateFormat("dd MM yyy");
    private static Colega[] colegas = new Colega[25];
    private static Familia[] familiares = new Familia[25];
    private static Estudiante[] estudiantes = new Estudiante[25];
    private static int indColegas = 0;
    private static int indFamiliares = 0;
    private static int indEstudiantes = 0;
	
	/*
	 * Setters y Getters de la fecha y sus parametrizaciones
	 */
	public static int getDiasTolerancia() {
		return diasTolerancia;
	}
	public static void setDiasTolerancia(int diasTolerancia) {
		Generales.diasTolerancia = diasTolerancia;
	}
	public static int getDiasAlerta() {
		return diasAlerta;
	}
	public static void setDiasAlerta(int diasAlerta) {
		Generales.diasAlerta = diasAlerta;
	}
	public static void setDiasPrestamo(int diasPrestamo){
		Generales.diasPrestamo = diasPrestamo;
	};
	public static int getDiasPrestamo(){
		return diasPrestamo;
	};
	public static void setFechaDelSistema(Calendar fecha){
		fechaDelSistema = fecha;
	};
	public static Calendar getFechaDelSistema(){
		return fechaDelSistema;
	};
	
	// Definición de las listas
	private static Libro[] listaLibrosPrestados = new Libro[100];
	private static Libro[] listaLibrosNoPrestados = new Libro[100];
	private static Libro[] topLibrosPrestamos = new Libro[100];
	private static Libro[] listaLibrosTarde = new Libro[100];

	// Definición de los índices de las listas
	private static int indListaLibrosPrestados;
	private static int indListaLibrosNoPrestados;
	private static int indTopLibrosPrestamos;
	private static int indListaLibrosTarde;
	
	//Métodos para obtener estas listas
	public static Libro[] getListaLibrosPrestados() {
		return listaLibrosPrestados;
	}
	public static Libro[] getListaLibrosNoPrestados() {
		return listaLibrosNoPrestados;
	}
	public static Libro[] getTopLibrosPrestamos() {
		return topLibrosPrestamos;
	}
	public static Libro[] getListaLibrosTarde() {
		return listaLibrosTarde;
	}

	// Métodos para agregar a estas listas
	public static void addListaLibrosPrestados(Libro libro) {
		listaLibrosPrestados[indListaLibrosPrestados] = libro;
		indListaLibrosPrestados++;
	}
	public static void addListaLibrosNoPrestados(Libro libro) {
		listaLibrosNoPrestados[indListaLibrosNoPrestados] = libro;
		indListaLibrosNoPrestados++;
	}
	public static void addTopLibrosPrestamos(Libro libro) {
		topLibrosPrestamos[indTopLibrosPrestamos] = libro;
		indTopLibrosPrestamos++;
	}
	public static void addListaLibrosTarde(Libro libro) {
		listaLibrosTarde[indListaLibrosTarde] = libro;
		indListaLibrosTarde++;
	}

	// Métodos para setear estas listas
	public static void setListaLibrosPrestados(Libro[] lista) {
		listaLibrosPrestados = lista;
	};	
	public static void setListaLibrosNoPrestados(Libro[] lista) {
		listaLibrosNoPrestados = lista;
	};
	public static void setTopLibrosPrestamos(Libro[] lista) {
		topLibrosPrestamos = lista;
	};	
	public static void setListaLibrosTarde(Libro[] lista) {
		listaLibrosTarde = lista;
	};

	// Métodos para eliminar de estas listas
	/*
	 * Falta Testing
	 * 	 
	 * */
	public static void delListaLibrosNoPrestados(Articulo articulo) {
		Libro[] temp = new Libro[elementosEnLista(listaLibrosNoPrestados)];
		int indTemp = 0;
		for(Libro l : listaLibrosNoPrestados){
			if(l == null || indTemp == indListaLibrosNoPrestados-1){
				break;
			};
			if(articulo.getTitulo().compareToIgnoreCase(l.getTitulo()) != 0){
				temp[indTemp] = l;
			}else{
				continue;
			};
			indTemp++;
		};
		setListaLibrosNoPrestados(temp);
	};	
	public static void delListaLibrosPrestados(Articulo articulo) {
		Libro[] temp = new Libro[elementosEnLista(listaLibrosPrestados)];
		int indTemp = 0;
		for(Libro l : listaLibrosPrestados){
			if(l == null || indTemp == indListaLibrosPrestados-1){
				break;
			};
			if(articulo.getTitulo().compareToIgnoreCase(l.getTitulo()) != 0){
				temp[indTemp] = l;
			}else{
				continue;
			};
			indTemp++;
		};
		setListaLibrosPrestados(temp);
	};
	public static void delTopLibrosPrestamos(Articulo articulo) {
		Libro[] temp = new Libro[elementosEnLista(topLibrosPrestamos)];
		int indTemp = 0;
		for(Libro l : topLibrosPrestamos){
			if(l == null || indTemp == indTopLibrosPrestamos-1){
				break;
			};
			if(articulo.getTitulo().compareToIgnoreCase(l.getTitulo()) != 0){
				temp[indTemp] = l;
			}else{
				continue;
			};
			indTemp++;
		};
		setTopLibrosPrestamos(temp);
	};
	public static void delListaLibrosTarde(Articulo articulo) {
		Libro[] temp = new Libro[elementosEnLista(listaLibrosTarde)];
		int indTemp = 0;
		for(Libro l : listaLibrosTarde){
			if(l == null || indTemp == indListaLibrosTarde-1){
				break;
			};
			if(articulo.getTitulo().compareToIgnoreCase(l.getTitulo()) != 0){
				temp[indTemp] = l;
			}else{
				continue;
			};
			indTemp++;
		};
		setListaLibrosTarde(temp);
	};
	
	
	// Métodos para adelantar o retroceder fecha
	public static void adelantarFechaPor5(){
		fechaDelSistema.add(Calendar.DAY_OF_YEAR, 5);
		System.out.println(Generales.getFechaDelSistema().getTime());
	};
	public static void adelantarFechaPor30(){
		fechaDelSistema.add(Calendar.DAY_OF_YEAR, 30);
		System.out.println(Generales.getFechaDelSistema().getTime());
	};
	public static void retrocederFechaPor5(){
		fechaDelSistema.add(Calendar.DAY_OF_YEAR, -5);
		System.out.println(Generales.getFechaDelSistema().getTime());
	};
	public static void retrocederFechaPor30(){
		fechaDelSistema.add(Calendar.DAY_OF_YEAR, -30);
		System.out.println(Generales.getFechaDelSistema().getTime());
	};
	
	public static int elementosEnLista(Libro[] lista){
		int resultado = 0; 
		for(Libro i : lista){
			if (i != null){
				resultado++;
			};
		};
		return resultado;
	};


	/* ----- TITULO
	 * 
	 * Algoritmo de ordenamiento burbuja.
	 * Ordena los libros por título de la lista que le sea proporcionada
	 */
	public static Libro[] ordenarListaPorTitulo(Libro[] lista){
		int n = Generales.elementosEnLista(lista)+1;
		Libro aux;
		for(int l = 0; l < n; l++){
			for(int j = 1; j < (n-1); j++){
				if(lista[j-1].comparaTitulo(lista[j]) > 0){
					aux = lista[j-1];
					lista[j-1] = lista[j];
					lista[j] = aux;
				};
			};
		};
		return lista;
	};
	
	/* ----- CANTIDAD DE PRESTAMOS
	 * 
	 * Algoritmo de ordenamiento burbuja. 
	 * Ordena los libros por cantidad de prestamos de la lista que le sea proporcionada
	 */
	public static Libro[] ordenarListaPorPrestamo(Libro[] lista){
		int n = Generales.elementosEnLista(lista)+1;
		Libro aux;
		for(int l = 0; l < n; l++){
			for(int j = 1; j < (n-1); j++){
				if(lista[j-1].comparaCantPrestamos(lista[j]) < 0){
					aux = lista[j-1];
					lista[j-1] = lista[j];
					lista[j] = aux;
				};
			};
		};
		return lista;
	};
	
	// Método para agregar clientes (personas)
	public static void agregarColega(Colega colega){
		colegas[indColegas] = colega;
		indColegas++;
	};
	public static void agregarFamiliar(Familia familiar){
		familiares[indFamiliares] = familiar;
		indFamiliares++;
	};
	public static void agregarEstudiante(Estudiante estudiante){
		estudiantes[indEstudiantes] = estudiante;
		indEstudiantes++;
	};
	
	/*
	//Listas Revistas
	private Revista[] listaRevistasPrestadas;
	private Revista[] topRevistasPrestamos;
	
	//Listas Peliculas
	private Pelicula[] listaPeliculasPrestadas;
	private Pelicula[] topPeliculasPrestamos;*/
	
	public static String toString(Articulo[] lista){
		String msg = "";
		for (int i = 0; i < lista.length; i++){
			if (lista[i] == null){
				break;
			}
			//System.out.println(lista[i].getTitulo());
			msg += i + "- " + lista[i].getTitulo() + "\n";
		};
		return msg;
	};
	
	
}
